/*
 * Copyright (C) 2022, KylinSoft Co., Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * Authors: iaom <zhangpengfei@kylinos.cn>
 *
 */
#ifndef MONITOR_H
#define MONITOR_H

#include <QObject>
#include "index-scheduler.h"
#include "database.h"
namespace UkuiSearch {
/**
 * @brief The Monitor class
 * 用于监控索引状态
 * 为qml
 */
class Monitor : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QStringList currentIndexPaths READ getCurrentIndexPaths)
    Q_PROPERTY(QString indexState READ getIndexState NOTIFY indexStateChanged)
    Q_PROPERTY(uint basicIndexSize READ getBasicIndexSize NOTIFY basicIndexSizeChange)
    Q_PROPERTY(uint contentIndexSize READ getContentIndexSize NOTIFY contentIndexSizeChange)
    Q_PROPERTY(uint ocrIndexSize READ getOCRIndexSize NOTIFY ocrIndexSizeChange)
    Q_PROPERTY(uint basicIndexProgress READ getBasicIndexProgress NOTIFY basicIndexProgressUpdate)
    Q_PROPERTY(uint contentIndexProgress  READ getContentIndexProgress NOTIFY contentIndexProgressUpdate)
    Q_PROPERTY(uint ocrIndexProgress  READ getOCRIndexProgress  NOTIFY ocrIndexProgressUpdate)
    Q_PROPERTY(uint basicIndexDocNum  READ getBasicIndexDocNum   NOTIFY basicIndexDocNumUpdate)
    Q_PROPERTY(uint contentIndexDocNum  READ getContentIndexDocNum   NOTIFY contentIndexDocNumUpdate)

public:
    explicit Monitor(IndexScheduler* scheduler,  QObject *parent = nullptr);
    /**
     * @brief getCurrentIndexPaths
     * @return 当前索引的所有目录
     */
    QStringList getCurrentIndexPaths();
    /**
     * @brief getIndexState
     * @return 当前索引调度器的状态
     */
    QString getIndexState();
    /**
     * @brief getBasicIndexSize
     * @return 当前需要处理的基础索引数量
     */
    uint getBasicIndexSize();
    /**
     * @brief getContentIndexSize
     * @return 当前需要处理的内容索引数量
     */
    uint getContentIndexSize();
    /**
     * @brief getOCRIndexSize
     * @return 当前需要处理的OCR索引数量
     */
    uint getOCRIndexSize();
    /**
     * @brief getBasicIndexProgress
     * @return 基础索引进度
     */
    uint getBasicIndexProgress();
    /**
     * @brief getContentIndexProgress
     * @return 内容索引进度
     */
    uint getContentIndexProgress();
    /**
     * @brief getOCRIndexProgress
     * @return ocr索引进度
     */
    uint getOCRIndexProgress();
    /**
     * @brief getBasicIndexDocNum
     * @return 基础索引完成的总文档数
     */
    uint getBasicIndexDocNum();
    /**
     * @brief getContentIndexDocNum
     * @return 内容索引完成的总文档数
     */
    uint getContentIndexDocNum();

Q_SIGNALS:
    /**
     * @brief indexStateChanged
     * 索引调度器状态
     */
    void indexStateChanged(QString);
    /**
     * @brief basicIndexSizeChange
     * 基础索引进度
     */
    void basicIndexSizeChange(uint);
    /**
     * @brief contentIndexSizeChange
     * 内容索引总量（包括OCR索引）
     */
    void contentIndexSizeChange(uint);
    /**
     * @brief ocrIndexSizeChange
     * OCR索引总量
     */
    void ocrIndexSizeChange(uint);

    /**
     * @brief basicIndexProgressUpdate
     * 基础索引进度
     */
    void basicIndexProgressUpdate(uint);
    /**
     * @brief contentIndexProgressUpdate
     * 内容索引进度（包含OCR索引）
     */
    void contentIndexProgressUpdate(uint);
    /**
     * @brief ocrIndexProgressUpdate
     * OCR索引进度
     */
    void ocrIndexProgressUpdate(uint);
    /**
     * @brief basicIndexDocNumUpdate
     * 基础索引完成的总文档数
     */
    void basicIndexDocNumUpdate(uint);
    /**
     * @brief contentIndexDocNumUpdate
     * 内容索引完成的总文档数
     */
    void contentIndexDocNumUpdate(uint);
    /**
     * @brief basicIndexDone
     * 基础索引数据库建立完成或完成增量更新
     */
    void basicIndexDone();
    /**
     * @brief contentIndexDone
     * 内容索引数据库建立完成或完成增量更新
     */
    void contentIndexDone();

private Q_SLOTS:
    void onIndexStateChanged(IndexScheduler::IndexerState);
    void processUpdate(IndexType type, uint all, uint finished);

private:
    IndexScheduler *m_scheduler = nullptr;
    Database m_basicDatabase;
    Database m_contentDatabase;
    uint m_basicIndexSize = 0;
    uint m_contentIndexSize = 0;
    uint m_ocrIndexSize = 0;
    uint m_basicIndexProgress = 0;
    uint m_contentIndexProgress = 0;
    uint m_ocrIndexProgress = 0;
};
}
#endif // MONITOR_H
